# @Time : 2020/8/26 16:13
# @Author : Fioman 
# @Phone : 13149920693
import cv2 as cv
import numpy as np
"""
腐蚀: erode.仅当结构化元素中的所有的元素都大于0的时候,才保留该元素的值,否则就置为0.变成背景.
去除白色前景区域,用来分割图像,或者将两个物体分开.
"""
image = cv.imread("pic/11.png")
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("Original",gray)
# 如果设置为None,将使用一个3*3的内核进行腐蚀
for i in range(0,10):
    eroded = cv.erode(gray.copy(),None,iterations=i+1)
    cv.imshow("Eroded {} times".format(i+1),eroded)
    cv.waitKey(0)
# 腐蚀对于从图像中去除小斑点或者断开两个连接的组件最有用.

# 腐蚀的反面是膨胀,就像腐蚀会腐蚀掉前景像素一样,膨胀也会增加前景像素.
# 膨胀会增加前景对象的大小,对于将图像的损坏部分连接在一起尤为重要
# 就像腐蚀一样,膨胀也使用结构元素,如果结构元素的任何像素 > 0 ,则结构元素的中心像素被设置为白色.

for i in range(0,5):
    dilated = cv.dilate(gray.copy(),None,iterations=i+1)
    cv.imshow("Dilated {} times".format(i+1),dilated)
    cv.waitKey(0)


# 开运算. 什么是开运算.就是先腐蚀再膨胀. 腐蚀分开,膨胀然后补齐.
# 首先用腐蚀去除小斑点,然后用膨胀以重新生成原始对象的大小.
image = cv.imread("pic/12.png")
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("Original",gray)
kernelSizes = [(3,3),(5,5),(7,7)]

for kernelSize in kernelSizes:
    kernel = cv.getStructuringElement(cv.MORPH_RECT,kernelSize)
    opening = cv.morphologyEx(gray,cv.MORPH_OPEN,kernel)
    cv.imshow("Opening: ({},{})".format(kernelSize[0],kernelSize[1]),opening)
    cv.waitKey(0)


# 闭运算,什么是闭原酸.就是先膨胀后腐蚀,膨胀完成物体的连通,腐蚀就是还原物体的大小.
image = cv.imread("pic/11.png")
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("Original",gray)

for kernelSize in kernelSizes:
    kernel = cv.getStructuringElement(cv.MORPH_RECT,kernelSize)
    closing = cv.morphologyEx(gray,cv.MORPH_CLOSE,kernel)
    cv.imshow("Closing: ({},{})".format(kernelSize[0],kernelSize[1]),closing)
    cv.waitKey(0)


# 形态梯度, 形态梯度是膨胀和腐蚀之间的差异,对于确定图像的特定对象的轮廓很有用.
for kernelSize in kernelSizes:
    kernel = cv.getStructuringElement(cv.MORPH_RECT,kernelSize)
    gradient = cv.morphologyEx(gray,cv.MORPH_GRADIENT,kernel)
    cv.imshow("Gradient: ({},{})".format(kernelSize[0],kernelSize[1]),gradient)
    cv.waitKey(0)


# 顶帽/白帽操作 .顶帽和白帽的形态操作是原始(灰度/单通道)输入图像与开操作之间的差异.可以显示深色背景上的图像的明亮区域.
# 黑帽操作. 输入图像闭合 和输入图像之间的差异
image = cv.imread("pic/13.png")
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
rectKernel = cv.getStructuringElement(cv.MORPH_RECT,(13,5))
blackHat = cv.morphologyEx(gray,cv.MORPH_BLACKHAT,rectKernel)
cv.imshow("BlackHat",blackHat)
cv.waitKey(0)

topHat = cv.morphologyEx(gray,cv.MORPH_TOPHAT,rectKernel)
cv.imshow("TopHat",topHat)
cv.waitKey(0)


































